package com.jml.单例模式.序列化;

import com.jml.单例模式.反射破坏内部类.LazyInnerClassSingleton;

import java.io.Serializable;

/**
 * 序列化会破坏单例模式，序列化后的对象和序列化之前的对象不是同一个对象，这个就违背了单例模式
 */
public class SeriableSingleton extends Te implements Serializable {

    private static final SeriableSingleton s1 = new SeriableSingleton();

    private SeriableSingleton(){
        System.out.println("执行构造函数");
        if(s1!=null){
            throw new RuntimeException("");
        }
    }

    public static SeriableSingleton getInstance(){
        return s1;
    }
    //加入这个方法就会是序列化和反序列化都是系统一个对象
    //这种情况虽然保证了唯一，但是在创建的时候创建了两次对象，
    // 先通过反射去创建这个对象的，但是没有使用，然后判断是否存在readResovler方法，存在就调用这个方法，如果不存在就直接返回之前反射创建的方法
    //存在这个方法就调用这个方法，不存在就不调用
    private  Object readResolve(){
        return s1;
    }
}
